package com.ctu.study
{
    import flash.display.Sprite;
    import flash.text.engine.TextBlock;
    import flash.text.engine.TextElement;
    import flash.text.engine.TextLine;
    import flash.text.engine.ElementFormat;
    import flash.text.engine.FontDescription;
    import flash.text.engine.FontPosture;
    import flash.text.engine.FontWeight;
    import mx.components.FxNumericStepper;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import mx.core.UIComponent;
    
    public class TextLineExample extends UIComponent {
        
        private var atomStepper:FxNumericStepper = new FxNumericStepper();
        private var atomDataContainer:Sprite;
        private var fontDescriptionItalic:FontDescription = new FontDescription("Arial", FontWeight.NORMAL, FontPosture.ITALIC);
        private var fontDescriptionNormal:FontDescription = new FontDescription("Arial", FontWeight.NORMAL , FontPosture.NORMAL);
        private var textBlock:TextBlock = new TextBlock();
        private var textLine:TextLine;
        
        public function TextLineExample():void {
            
            var myText:String = "I am a TextElement, created from a String and assigned " +
            "to the content property of a TextBlock. From the text block, " +
            "the createTextLine() method created these lines, 300 pixels wide, "  +
            "for display." ;
            
            atomStepper.minimum = 0;
            atomStepper.value = 0;
            atomStepper.width = 50;
            atomStepper.height = 20;
            addChild(atomStepper);
            atomStepper.x = 20;
            atomStepper.y = 120;
            atomStepper.addEventListener(Event.CHANGE, nsChange);
            
            var directions:String = "Click up / down arrows to frame atoms in text block above.";
            
            var formatItalic:ElementFormat = new ElementFormat(fontDescriptionItalic);
            formatItalic.fontSize = 12;
            var textElement1:TextElement = new TextElement(directions, formatItalic);
            textBlock.content = textElement1;
            createLines(textBlock, 15, 160, 400, this);
            
            var formatNormal:ElementFormat = new ElementFormat(fontDescriptionNormal);
            formatNormal.fontSize = 16;
            var textElement2:TextElement = new TextElement(myText, formatNormal);
            textBlock.content = textElement2;
            createLines(textBlock, 15.0, 20.0, 300, this);
            textLine = textBlock.firstLine;
            atomStepper.maximum = textLine.atomCount - 1;
            showAtom(textLine, 0);
        }
            
        private function nsChange(event:Event):void
        {
            removeAtom(textLine);
            if (atomStepper.value == textLine.atomCount - 1)
            {
                if(textLine != textBlock.lastLine)
                {
                    textLine = textLine.nextLine;
                    atomStepper.maximum = textLine.atomCount - 1;
                    atomStepper.value = 0;
                }
            }
            showAtom(textLine, atomStepper.value);
        }
            
        private function createLines(textBlock, startX, startY, width, container)
        {
            var textLine:TextLine = textBlock.createTextLine (null, width);
            while (textLine)
            {
                textLine.x = startX;
                textLine.y = startY;
                startY += textLine.height + 2;
                container.addChild(textLine);
                textLine = textBlock.createTextLine (textLine, width);
            }
        }
            
        private function showAtom(textLine, i):void
        {
            var box:Sprite = new Sprite();
            var mcGraphics = box.graphics;
            var bounds:Rectangle = textLine.getAtomBounds(i);
            mcGraphics.lineStyle(1, 0xFF0000, 1.0);
            mcGraphics.drawRect(bounds.left, bounds.top, bounds.width, bounds.height);
            textLine.userData = textLine.addChild(box);
            displayAtomData(textLine,i);
        }
            
        private function displayAtomData(textLine, i)
        {
            if(atomDataContainer != null)
                removeChild(atomDataContainer);
            atomDataContainer=new Sprite();
            var format = new ElementFormat(fontDescriptionNormal);
            format.color = 0x00000FF;
            var n:int = 0;
            var nxtY:Number = 0;
            var atomInfo:String = "value of getAtomBidiLevel() is: " + textLine.getAtomBidiLevel(i)+"\n"
            +"value of getAtomCenter() is: " + textLine.getAtomCenter(i)+"\n"
            +"value of getAtomIndexAtCharIndex() is: " + textLine.getAtomIndexAtCharIndex(i)+"\n"
            +"value of getAtomTextBlockBeginIndex() is: " + textLine.getAtomTextBlockBeginIndex(i)+"\n"
            +"value of getAtomTextBlockEndIndex() is: " + textLine.getAtomTextBlockEndIndex(i)+"\n"
            +"value of getAtomTextRotation() is: " + textLine.getAtomTextRotation(i)+"\n";
            var atomtextBlock:TextBlock = new TextBlock();
            var textElement3:TextElement = new TextElement(atomInfo, format);
            atomtextBlock.content = textElement3;
            createLines(atomtextBlock,20,200,500, atomDataContainer)
            addChild(atomDataContainer);
        }
            
        private function removeAtom(textLine):void
        {
            textLine.removeChild(textLine.userData);
        }
    }    
}